`
https://leetcode.cn/problems/median-of-two-sorted-arrays/
`

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number}
 */
var findMedianSortedArrays = function (nums1, nums2) {
  const m = nums1.length;
  const n = nums2.length;
  const total = m + n;

  if (total % 2 === 1) {
    // 奇数长度，返回第 (total+1)/2 小的元素
    return findKth(nums1, 0, nums2, 0, Math.floor(total / 2) + 1);
  } else {
    // 偶数长度，返回第 total/2 和 total/2 +1 小的元素的平均值
    const left = findKth(nums1, 0, nums2, 0, total / 2);
    const right = findKth(nums1, 0, nums2, 0, total / 2 + 1);
    return (left + right) / 2;
  }
};

function findKth(nums1, start1, nums2, start2, k) {
  // 确保nums1的剩余长度不超过nums2的剩余长度，简化后续处理
  const len1 = nums1.length - start1;
  const len2 = nums2.length - start2;
  if (len1 > len2) {
    return findKth(nums2, start2, nums1, start1, k);
  }

  // 如果nums1的剩余长度为0，直接从nums2中取第k小的元素
  if (len1 === 0) {
    return nums2[start2 + k - 1];
  }

  // 当k为1时，返回两个数组当前起始位置的较小值
  if (k === 1) {
    return Math.min(nums1[start1], nums2[start2]);
  }

  // 计算每个数组需要比较的位置，处理数组长度不足的情况
  const p = Math.floor(k / 2);
  const i = start1 + Math.min(p, len1) - 1;
  const j = start2 + Math.min(p, len2) - 1;
  const val1 = i < nums1.length ? nums1[i] : Infinity;
  const val2 = j < nums2.length ? nums2[j] : Infinity;

  // 递归排除较小的前p个元素
  if (val1 <= val2) {
    return findKth(nums1, i + 1, nums2, start2, k - (i - start1 + 1));
  } else {
    return findKth(nums1, start1, nums2, j + 1, k - (j - start2 + 1));
  }
}